package com.cskaoyan.javase.oop.privatemember14;

/**
 * @description: 封装
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *
 * 思考：我们之前定义的类中，都没有关注访问权限控制符，会有什么问题？
 * 没有权限控制，别人可以随意使用，有些人是我们不想让它使用
 * 普通情况的访问和修改的形式过于简陋，没有办法做任何处理
 * - 可能用户会设置不合法的数据
 * - 希望用户能够看到应该看的内容
 * 这种形式 写法是不合理，以后我们在开发当中也不会写这种代码
 * 普遍情况下，应该用private修饰成员变量
 * 加了age虽然是好事，但是在外界永远都访问不了
 * 所以我们要提供public修饰的访问方法
 * 所以也要加一个public修饰的修改方法
 *
 * 你觉得你有什么问题？
 * 我啥都不加，不权限控制，是默认权限，但是你现在给public修饰的方法去访问 去修改，有何意义？
 * 1，封装的原理，隐藏细节
 * 2，可以方便的去控制修改，如果输入的参数不合法，可以不允许赋值，这叫做可以控制赋值了
 * 3,可以控制让别人看到的内容，可以控制变量的访问值
 * 4，把变量的访问和赋值分开了，这样代码的维护性 扩展性就更强了
 *
 *
 * 最后一个问题 填一个坑，为什么boolean类型不能用isXxx
 * 快捷键 get set方法也有快捷键
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        Teacher t = new Teacher();
        //t.age = 500;
        //System.out.println(t.age);
        //t.age
        t.setAge(48);
        System.out.println(t.getAge());
    }
}

class Teacher {
    private int age;
    boolean isMale; //很遗憾 没有叫做male的布尔变量，所以 它只好报错，程序终止，程序终止-->用户打电话给客服
    //客服领导找到你领导,你领导又找到你，于是你加班加点改bug
    boolean test;

    //布尔类型的get方法比较特殊，它是用isXxx的形式去写get方法
    public boolean isTest() {
        return test;
    }

    //isMale的访问方法 这里方法名和变量名保持了一致
    public boolean isMale() { //原先的布尔类型变量是什么？是male 实际上大多数框架也是这么去找布尔类型变量的get方法
        return isMale;
    }

    public void setMale(boolean male) {
        isMale = male;
    }

    //提供给外界一个访问方法
    public int getAge() {
        //不管我到底多少岁，我永远是仙女，永远是少女
        return 18;
    }

    //提供给外界一个修改方法 接收传参
    public void setAge(int age) {
        //这里怎么写？
        if (age > 150 || age < 0){
            System.out.println("输入的年龄不合法");
        }else {
            this.age = age;
        }
    }
}